package py.com.sole.dao.impl;

import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.apache.log4j.Logger;

import py.com.sole.dao.DaoFactory;
import py.com.sole.dao.ClaseDao;
import py.com.sole.model.Clase;
import py.com.sole.model.TipoDocumento;

public class ClaseImpl implements ClaseDao {
    
    EntityManager em = DaoFactory.getEm();
    private static final Logger logger = Logger.getLogger(ClaseDao.class);
    
    @Override
    public Clase addClase(Clase clase) {
        try {
            em.getTransaction().begin();
            em.persist(clase);
            em.getTransaction().commit();
            return clase;
        } catch (Exception e) {
            logger.error("No se pudo insertar el clase " + e);
            return null;
        }
        
    }
    
    @Override
    public void deleteClase(int id) {
        // TODO Auto-generated method stub

    }
    
    @Override
    public void updateClase(Clase clase) {
    	
    	try {
    		em.getTransaction().begin();
            em.merge(clase);
            em.getTransaction().commit();
            
        } catch (Exception e) {
            logger.error("Ocurrió un error al obtener el clase [getClaseById]"+e);
        }        
    }
    
    @Override
    public Clase getClaseById(int id) {
        try {
            return em.find(Clase.class, id);
        } catch (Exception e) {
            logger.error("Ocurrió un error al obtener el clase [getClaseById]"+e);
        }
        return null;
    }
    
    @Override
    public List<Clase> getClases() {
    	try {
            Query q = em.createNamedQuery("Clase.findAll");          
            return q.getResultList();
        } catch (Exception e) {
            logger.error("Error al obtener el clase [getClaseByName] :" + e);
            return null;
        }    	        
    }
    
    @Override
    public Clase getClaseByName(String value) {
        try {
            Query q = em.createNamedQuery("Clase.findByDescripcion");
            q.setParameter("descripcion", value);
            return (Clase) q.getSingleResult();
        } catch (Exception e) {
            logger.error("Error al obtener el clase [getClaseByName] :" + e);
            return null;
        }
        
    }
    
    @Override
    public List<Clase> getClaseByFilter(TipoDocumento tipoDocu, String nombre, String apellido, String nroDocu) {
        
        List<Clase> clases = new ArrayList<Clase>();
        List<Object[]> listObject = new ArrayList<Object[]>();
        
        if (nombre.equalsIgnoreCase("") && apellido.equalsIgnoreCase("") && nroDocu.equalsIgnoreCase("")) {
            return null;
        }
        
        String q = "SELECT \n"
                + "    pa.id,"
                + "    p.nombre, \n"
                + "    p.apellido, \n"
                + "    p.telefono,\n"
                + "    p.email,\n"
                + "    d.descripcion,\n"
                + "    p.documento,\n"
                + "    t.descripcion\n"
                + "FROM \n"
                + "    Clase pa left join pa.persona p\n"
                + "    left join p.direccion d,\n"
                + "    p.tipoDocumentoId t\n"
                + "WHERE \n"
                + "t.id = :tipoDocumento\n";
        
        if (!nombre.equals("")) {
            q = q + "    and p.nombre = :nombre\n";
        }
        
        if (!apellido.equals("")) {
            q = q + "    and p.apellido = :apellido\n";
        }
        
        if (!nroDocu.equalsIgnoreCase("")) {
            q = q + "    and p.documento = :documento";
        }
        try {
            Query query = em.createQuery(q);
            
            query.setParameter("tipoDocumento", tipoDocu.getId());
            
            if (!nombre.equalsIgnoreCase("")) {
                query.setParameter("nombre", nombre);
            }
            
            if (!apellido.equalsIgnoreCase("")) {
                query.setParameter("apellido", apellido);
            }
            if (!nroDocu.equalsIgnoreCase("")) {
                query.setParameter("documento", nroDocu);
            }
            
            listObject = query.getResultList();
            for (Object[] objects : listObject) {
                Clase clase = this.getClaseById(Integer.parseInt(objects[0].toString()));
                clases.add(clase);
            }
            
        } catch (Exception e) {
            logger.error("No se pudo obtener la lista de clases [getClaseByFilter]: " + e);
            return null;
        }
        
        return clases;
    }
    
}
